﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model4D
{
    internal class Cube4D : AbstractMultiDimModel
    {
        public Cube4D(double scaleFactor)
        {
            CreateCube4D(scaleFactor);
        }

        public override int Dimention => 4;

        private void CreateCube4D(double scaleFactor)
        {
            double s = scaleFactor * Math.Sqrt(2) / 2;

            Vector[] vecs = new Vector[16];
            Edge[] edges = new Edge[32];

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                    vecs[4 * i + j] = new Vector(Dimention);

                // задаем вершины куба
                // X координаты куба
                vecs[4 * i + 0].X[0] = -s;
                vecs[4 * i + 1].X[0] = 0;
                vecs[4 * i + 2].X[0] = s;
                vecs[4 * i + 3].X[0] = 0;

                // Y координаты куба
                vecs[4 * i + 0].X[1] = 0;
                vecs[4 * i + 1].X[1] = -s;
                vecs[4 * i + 2].X[1] = 0;
                vecs[4 * i + 3].X[1] = s;

                for (int j = 0; j < 4; j++)
                {
                    // Z координаты куба
                    vecs[4 * i + j].X[2] = (i % 2 == 0) ? -scaleFactor / 2 : scaleFactor / 2;

                    // U координаты куба (4-ая координата)
                    vecs[4 * i + j].X[3] = (i < 2) ? -scaleFactor / 2 : scaleFactor / 2;
                }

                // задаем ребра куба
                edges[i + 0] = new Edge(i + 0, (i + 1) % 4);
                edges[i + 4] = new Edge(i + 4, (i + 1) % 4 + 4);
                edges[i + 8] = new Edge(i + 8, (i + 1) % 4 + 8);
                edges[i + 12] = new Edge(i + 12, (i + 1) % 4 + 12);

                edges[i + 16] = new Edge(i + 0, i + 4);
                edges[i + 20] = new Edge(i + 8, i + 12);

                edges[i + 24] = new Edge(i + 0, i + 8);
                edges[i + 28] = new Edge(i + 4, i + 12);
            }

            _vectors = new List<Vector>();
            _edges = new List<Edge>();

            _vectors.AddRange(vecs);
            _edges.AddRange(edges);
        }
    }
}
